package com.xkcoding.task.config;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.hikvision.artemis.sdk.ArtemisHttpUtil;
import com.hikvision.artemis.sdk.Response;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import com.hikvision.artemis.sdk.constant.SystemHeader;
import com.sun.tools.javac.util.List;
import com.xkcoding.task.config.dto.AddPersonGroupDto;
import com.xkcoding.task.config.dto.DoorControlDto;
import com.xkcoding.task.config.dto.EventDto;
import com.xkcoding.task.config.dto.PersonGroupOperation;

import java.io.InputStream;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class ArtemisPostTest {
  /**
   * 请根据技术支持提供的实际的平台IP/端口和API网关中的合作方信息更换static静态块中的三个参数.
   * [1 host]
   * 		host格式为IP：Port，如10.0.0.1:443
   * 		当使用https协议调用接口时，IP是平台（nginx）IP，Port是https协议的端口；
   *     当使用http协议调用接口时，IP是artemis服务的IP，Port是artemis服务的端口（默认9016）。
   * [2 appKey和appSecret]
   * 		请按照技术支持提供的合作方Key和合作方Secret修改
   * 	    appKey：合作方Key
   * 	    appSecret：合作方Secret
   * 调用前看清接口传入的是什么，是传入json就用doPostStringArtemis方法，是表单提交就用doPostFromArtemis方法
   *
   */
  /**
   * API网关的后端服务上下文为：/artemis
   */
  private static final String ARTEMIS_PATH = "/artemis";


  /**
   * 调用POST请求类型接口，这里以获取组织列表为例
   * 接口实际url:https://ip:port/artemis/api/resource/v1/org/orgList
   *
   * @return
   */
  public static String callPostApiGetOrgList() throws Exception {
    /**
     * https://ip:port/artemis/api/resource/v1/org/orgList
     * 通过查阅AI Cloud开放平台文档或网关门户的文档可以看到获取组织列表的接口定义,该接口为POST请求的Rest接口, 入参为JSON字符串，接口协议为https。
     * ArtemisHttpUtil工具类提供了doPostStringArtemis调用POST请求的方法，入参可传JSON字符串, 请阅读开发指南了解方法入参，没有的参数可传null
     */
    ArtemisConfig config = new ArtemisConfig();
    config.setHost("10.23.6.199"); // 代理API网关nginx服务器ip端口
    config.setAppKey("23101454");  // 秘钥appkey
    config.setAppSecret("OEA92w1IZowXBccQFdxH");// 秘钥appSecret
    final String getCamsApi = ARTEMIS_PATH + "/api/resource/v1/org/orgList";
    Map<String, String> paramMap = new HashMap<String, String>();// post请求Form表单参数
    paramMap.put("pageNo", "1");
    paramMap.put("pageSize", "100");
    String body = JSON.toJSON(paramMap).toString();
    Map<String, String> path = new HashMap<String, String>(2) {
      {
        put("https://", getCamsApi);
      }
    };
    return ArtemisHttpUtil.doPostStringArtemis(config, path, body, null, null, "application/json");
  }


  /**
   * 调用POST请求类型接口，这里以分页获取区域列表为例
   * 接口实际url：https://ip:port/artemis/api/api/resource/v1/regions
   *
   * @return
   */
  public static String callPostApiGetRegions() throws Exception {
    /**
     * https://ip:port/artemis/api/resource/v1/regions
     * 过查阅AI Cloud开放平台文档或网关门户的文档可以看到分页获取区域列表的定义,这是一个POST请求的Rest接口, 入参为JSON字符串，接口协议为https。
     * ArtemisHttpUtil工具类提供了doPostStringArtemis调用POST请求的方法，入参可传JSON字符串, 请阅读开发指南了解方法入参，没有的参数可传null
     */
    ArtemisConfig config = new ArtemisConfig();
    config.setHost("10.23.6.199"); // 代理API网关nginx服务器ip端口
    config.setAppKey("23101454");  // 秘钥appkey
    config.setAppSecret("OEA92w1IZowXBccQFdxH");// 秘钥appSecret
    final String getCamsApi = ARTEMIS_PATH + "/api/resource/v1/regions";
    Map<String, String> paramMap = new HashMap<String, String>();// post请求Form表单参数
    paramMap.put("pageNo", "1");
    paramMap.put("pageSize", "2");
    paramMap.put("treeCode", "0");
    String body = JSON.toJSON(paramMap).toString();
    Map<String, String> path = new HashMap<String, String>(2) {
      {
        put("https://", getCamsApi);
      }
    };
    return ArtemisHttpUtil.doPostStringArtemis(config, path, body, null, null, "application/json");
  }

  /**
   * 调用POST接口，返回图片
   * 接口实际url：https://ip:port/artemis/api/visitor/v1/record/pictures
   *
   * @return
   */
  public static String callPostImgs() throws Exception {
    ArtemisConfig config = new ArtemisConfig();
    config.setHost("10.23.6.199"); // 代理API网关nginx服务器ip端口
    config.setAppKey("23101454");  // 秘钥appkey
    config.setAppSecret("OEA92w1IZowXBccQFdxH");// 秘钥appSecret
    final String getSecurityApi = "/artemis" + "/api/visitor/v1/record/pictures"; // 接口路径
    Map<String, String> path = new HashMap<String, String>(2) {
      {
        put("https://", getSecurityApi);
      }
    };
    Map<String, String> head = new HashMap<String, String>(2) {  //get请求的head参数
      {
        put("headpost", "sky-test");
      }
    };
    Map<String, String> query = new HashMap<String, String>(2) {  //get请求的head参数
      {
        put("domainId", "0");
      }
    };
    JSONObject jsonBody = new JSONObject();
    jsonBody.put("svrIndexCode", "9ff58bc2-65a5-464b-b28c-daea67ba9569");
    jsonBody.put("picUri", "/pic?9dda12i40-e*5b84626c4105m5ep=t=i3p*i=d1s*i=d3b*i1d3b*855925cea-96008b--2718943z855s=5i76=");
    String body = jsonBody.toJSONString();
    //参数根据接口实际情况设置
    //参数根据接口实际情况设置
    //【注】：该方法从artemis-http-client v1.1.12版本后，返回值修改为Response，此前为HttpResponse;升级时注意兼容性问题
    Response result = ArtemisHttpUtil.doPostStringImgArtemis(config, path, body, null, null, "application/json", null);

    try {

      if (302 == result.getStatusCode()) {
                /*
                获取图片数据保存到本地
                注：1.对于有时效的图片，必须尽快保存到本地
                   2.若无时效，则可以直接保存location，后续自行访问获取
                 */
//				String location=  result.getHeader("Location");
//				HttpGet httpget = new HttpGet(location);
//				HttpClient httpClient = wrapClient(httpget.getURI().getScheme()+"://"+httpget.getURI().getHost());
//				HttpResponse execute = httpClient.execute(httpget);
//				HttpEntity entity = execute.getEntity();
//				InputStream in = entity.getContent();
//				Tools.savePicToDisk(in, "d:/", "test311.jpg");
        //TODO 可以返回保存后的路径
      } else {
        System.out.println("下载出错:" + result.getBody());
      }

    } catch (Exception e) {
      e.printStackTrace();
    }

    return getSecurityApi;
  }

  /**
   * 调用POST接口，下载文件
   * 接口实际url：https://ip:port/artemis/api/fedof/v1/org/downloadCameraCSV
   *
   * @return
   */
  public static void callPostDownloadFile() throws Exception {
    ArtemisConfig config = new ArtemisConfig();
    config.setHost("10.23.6.199"); // 代理API网关nginx服务器ip端口
    config.setAppKey("23101454");  // 秘钥appkey
    config.setAppSecret("OEA92w1IZowXBccQFdxH");// 秘钥appSecret
    final String getSecurityApi = "/artemis" + "/api/fedof/v1/org/downloadCameraCSV"; // 接口路径
    Map<String, String> path = new HashMap<String, String>(2) {
      {
        put("https://", getSecurityApi);
      }
    };
    Map<String, String> head = new HashMap<String, String>(2) {  //get请求的head参数
      {
        put("headpost", "sky-test");
      }
    };
    Map<String, String> query = new HashMap<String, String>(2) {  //get请求的head参数
      {
        put("domainId", "0");
      }
    };
    JSONObject jsonBody = new JSONObject();
    jsonBody.put("svrIndexCode", "9ff58bc2-65a5-464b-b28c-daea67ba9569");
    jsonBody.put("picUri", "/pic?9dda12i40-e*5b84626c4105m5ep=t=i3p*i=d1s*i=d3b*i1d3b*855925cea-96008b--2718943z855s=5i76=");
    String body = jsonBody.toJSONString();
    //参数根据接口实际情况设置
    //参数根据接口实际情况设置
    //【注】：该方法从artemis-http-client v1.1.12版本后，返回值修改为Response，此前为HttpResponse;升级时注意兼容性问题
    Response result = ArtemisHttpUtil.doPostDownloadFileArtemis(config, path, body, null, null, null, null);

    String filePath = "D:\\download\\";
    InputStream content = result.getResponse().getEntity().getContent();
    Tools.savePicToDisk(content, filePath, "test.zip");
  }

  /**
   * 调用POST请求类型接口，这里演示了外层代理服务对artemis对外接口封装的场景。例如：
   * artemis上开放的接口实际url：https://ip:port/artemis/api/api/resource/v1/regions
   * 外部代理服务上上开放的接口url：https://ip:port/proxy/api/api/resource/v1/regions
   * 需保证安全认证库签名使用的path参数与artemis一致，可在请求头中设置x-ca-path参数，内容为:/artemis/api/api/resource/v1/regions
   *
   * @return
   */
  public static String callPostApiGetRegionsByProxy() throws Exception {
    /**
     * https://ip:port/proxy/api/api/resource/v1/regions
     */
    ArtemisConfig config = new ArtemisConfig();
    config.setHost("10.23.6.199"); // 代理API网关nginx服务器ip端口
    config.setAppKey("23101454");  // 秘钥appkey
    config.setAppSecret("OEA92w1IZowXBccQFdxH");// 秘钥appSecret
    final String getCamsApi = "/proxy/api/resource/v1/regions";
    Map<String, String> paramMap = new HashMap<String, String>();// post请求Form表单参数
    paramMap.put("pageNo", "1");
    paramMap.put("pageSize", "2");
    paramMap.put("treeCode", "0");
    String body = JSON.toJSON(paramMap).toString();
    Map<String, String> path = new HashMap<String, String>(2) {
      {
        put("https://", getCamsApi);
      }
    };
    Map<String, String> head = new HashMap<String, String>(2) {
      {
        put(SystemHeader.X_CA_PATH, "/artemis/api/api/resource/v1/regions");
      }
    };
    return ArtemisHttpUtil.doPostStringArtemis(config, path, body, null, null, "application/json", head);
  }


  /**
   * 调用POST请求类型接口，按照事件类型订阅事件
   * 接口实际url:https://ip:port/artemis/api/eventService/v1/eventSubscriptionByEventTypes
   *
   * @return
   */
  public static String callPostSubscriptionByEventTypes() throws Exception {
    ArtemisConfig config = new ArtemisConfig();
    config.setHost("10.23.6.199"); // 代理API网关nginx服务器ip端口
    config.setAppKey("23101454");  // 秘钥appkey
    config.setAppSecret("OEA92w1IZowXBccQFdxH");// 秘钥appSecret
    final String getCamsApi = ARTEMIS_PATH + "/api/eventService/v1/eventSubscriptionByEventTypes";
    EventDto eventDto = new EventDto();
    eventDto.setEventTypes(List.of(197162L, 197163L));
    eventDto.setEventDest("http://10.23.6.199:16000/demo/event/receiver");
    eventDto.setSubType(2);
    eventDto.setEventLvl(List.of(0, 1, 2, 3, 4, 5));
    String body = JSON.toJSON(eventDto).toString();
    Map<String, String> path = new HashMap<String, String>(2) {
      {
        put("https://", getCamsApi);
      }
    };
    return ArtemisHttpUtil.doPostStringArtemis(config, path, body, null, null, "application/json");
  }


  /**
   * 调用POST请求类型接口，门禁点翻空
   * 接口实际url：https://ip:port/artemis/api/acs/v1/door/doControl
   * 0-常开   1-门闭   2-门开   3-常闭
   *
   * @return
   */
  public static String doorController(Integer controlType) throws Exception {
    /**
     * https://ip:port/artemis/api/acs/v1/door/doControl
     * 过查阅AI Cloud开放平台文档或网关门户的文档可以看到分页获取区域列表的定义,这是一个POST请求的Rest接口, 入参为JSON字符串，接口协议为https。
     * ArtemisHttpUtil工具类提供了doPostStringArtemis调用POST请求的方法，入参可传JSON字符串, 请阅读开发指南了解方法入参，没有的参数可传null
     */
    ArtemisConfig config = new ArtemisConfig();
    config.setHost("10.23.6.199"); // 代理API网关nginx服务器ip端口
    config.setAppKey("23101454");  // 秘钥appkey
    config.setAppSecret("OEA92w1IZowXBccQFdxH");// 秘钥appSecret
    final String getCamsApi = ARTEMIS_PATH + "/api/acs/v1/door/doControl";
    DoorControlDto doorControlDto = new DoorControlDto();
    doorControlDto.setControlType(controlType);
    doorControlDto.setDoorIndexCodes(Collections.singletonList("9a8e685e1c154cd795adddbf23b9d0e9"));
    String body = JSON.toJSON(doorControlDto).toString();
    Map<String, String> path = new HashMap<String, String>(2) {
      {
        put("https://", getCamsApi);
      }
    };
    return ArtemisHttpUtil.doPostStringArtemis(config, path, body, null, null, "application/json");
  }


  /**
   * 调用POST 添加人员分组
   * 接口实际url：
   *
   * @return
   */
  public static String acsPersonGroupAdd(String groupName) throws Exception {
    /**
     * https://ip:port/artemis/api/acs/v1/door/doControl
     * 过查阅AI Cloud开放平台文档或网关门户的文档可以看到分页获取区域列表的定义,这是一个POST请求的Rest接口, 入参为JSON字符串，接口协议为https。
     * ArtemisHttpUtil工具类提供了doPostStringArtemis调用POST请求的方法，入参可传JSON字符串, 请阅读开发指南了解方法入参，没有的参数可传null
     */
    ArtemisConfig config = new ArtemisConfig();
    config.setHost("10.23.6.199"); // 代理API网关nginx服务器ip端口
    config.setAppKey("23101454");  // 秘钥appkey
    config.setAppSecret("OEA92w1IZowXBccQFdxH");// 秘钥appSecret
    final String getCamsApi = ARTEMIS_PATH + "/api/v1/personGroup/addition";
    AddPersonGroupDto addPersonGroupDto = new AddPersonGroupDto();
    addPersonGroupDto.setGroupName(groupName);
    String body = JSON.toJSON(addPersonGroupDto).toString();
    Map<String, String> path = new HashMap<String, String>(2) {
      {
        put("https://", getCamsApi);
      }
    };
    return ArtemisHttpUtil.doPostStringArtemis(config, path, body, null, null, "application/json");
  }


  /**
   * 调用POST 根据人员分组编号配置人员
   * 接口实际url：
   *
   * @return
   */
  public static String acsPersonGroupOperation(PersonGroupOperation personGroupOperation) throws Exception {
    /**
     * https://ip:port/artemis/api/acs/v1/door/doControl
     * 过查阅AI Cloud开放平台文档或网关门户的文档可以看到分页获取区域列表的定义,这是一个POST请求的Rest接口, 入参为JSON字符串，接口协议为https。
     * ArtemisHttpUtil工具类提供了doPostStringArtemis调用POST请求的方法，入参可传JSON字符串, 请阅读开发指南了解方法入参，没有的参数可传null
     */
    ArtemisConfig config = new ArtemisConfig();
    config.setHost("10.23.6.199"); // 代理API网关nginx服务器ip端口
    config.setAppKey("23101454");  // 秘钥appkey
    config.setAppSecret("OEA92w1IZowXBccQFdxH");// 秘钥appSecret
    final String getCamsApi = ARTEMIS_PATH + "/api/v1/personGroup/operation";
    String body = JSON.toJSON(personGroupOperation).toString();
    Map<String, String> path = new HashMap<String, String>(2) {
      {
        put("https://", getCamsApi);
      }
    };
    return ArtemisHttpUtil.doPostStringArtemis(config, path, body, null, null, "application/json");
  }

  /**
   * 调用POST请求类型接口，这里以查询人员列表
   * 接口实际url：https://ip:port/artemis/api/api/resource/v1/regions
   *
   * @return
   */
  public static String advancePersonList(String orgIndexCodes,Integer pageNo,Integer pageSize) throws Exception {
    /**
     * https://ip:port/artemis/api/resource/v1/regions
     * 过查阅AI Cloud开放平台文档或网关门户的文档可以看到分页获取区域列表的定义,这是一个POST请求的Rest接口, 入参为JSON字符串，接口协议为https。
     * ArtemisHttpUtil工具类提供了doPostStringArtemis调用POST请求的方法，入参可传JSON字符串, 请阅读开发指南了解方法入参，没有的参数可传null
     */
    ArtemisConfig config = new ArtemisConfig();
    config.setHost("10.23.6.199"); // 代理API网关nginx服务器ip端口
    config.setAppKey("23101454");  // 秘钥appkey
    config.setAppSecret("OEA92w1IZowXBccQFdxH");// 秘钥appSecret
    final String getCamsApi = ARTEMIS_PATH + "/api/resource/v2/person/advance/personList";
    Map<String, String> paramMap = new HashMap<String, String>();// post请求Form表单参数
    paramMap.put("pageNo", pageNo.toString());
    paramMap.put("pageSize", pageSize.toString());
    paramMap.put("orgIndexCodes", orgIndexCodes);
    paramMap.put("isSubOrg","true");
    String body = JSON.toJSON(paramMap).toString();
    Map<String, String> path = new HashMap<String, String>(2) {
      {
        put("https://", getCamsApi);
      }
    };
    return ArtemisHttpUtil.doPostStringArtemis(config, path, body, null, null, "application/json");
  }

  public static void main(String[] args) throws Exception {
    String VechicleDataResult = callPostApiGetRegions();
    System.out.println(VechicleDataResult);
  }

}
